/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uca.sisbec.helpers.manto;

import com.uca.sisbec.beans.NameAndCarnetBean;
import com.uca.sisbec.commons.Utils;
import com.uca.sisbec.forms.manto.BecarioForm;
import com.uca.sisbec.mapping.*;
import java.math.BigDecimal;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;

/**
 *
 * @author Susy
 */
public class BecarioHelper {

    private Session session;

    public BecarioHelper(Session session) {
        this.session = session;
    }

    public boolean validateBecario(BecarioForm bf) {
        List<Becario> becarioList;
        Query queryResult = session.createQuery("From Becario where carnet = :carnet");
        queryResult.setParameter("carnet", bf.getCarnet());
        becarioList = queryResult.list();
        if (becarioList.isEmpty()) {
            return true;
        }
        return false;
    }

    public Becario buscarBecarioDB(String carnet) {
        Becario bec;
        Query queryResult = session.createQuery("From Becario where carnet = :carnet");
        queryResult.setParameter("carnet", carnet);
        bec = (Becario) queryResult.uniqueResult();
        return bec;

    }

    public void insertarBecarioDB(BecarioForm bf) throws ParseException {
        Becario bec = new Becario();
        bec.setAlergicoA(bf.getAlergicoA());
        bec.setApellidos(bf.getApellido());
        bec.setCarnet(bf.getCarnet());
        System.out.println("El carnet es:"+bf.getCarnet());
        bec.setCma(bf.getCma());
        bec.setCodCarrera(bf.getCodCarrera());
        bec.setCum(BigDecimal.valueOf(bf.getCum()));
        bec.setDeptoOrigen(bf.getDeptoOrigen());
        bec.setDirActual(bf.getDirActual());
        bec.setDirIem(bf.getDirIem());
        bec.setDui(bf.getDui());
        bec.setEstCivil(bf.getEstCivil());
        bec.setEstado(bf.getEstado());
        /**
         * Convirtiendo las fechas de String a Timestamp para guardarlo en la
         * base
         */
        DateFormat formatter;

        Date date;
        Date fechaInCar;
        Date fechaFnCar = null;
        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        date = (Date) formatter.parse(bf.getFechaNac());
        fechaInCar = (Date) formatter.parse(bf.getFechaIniCarrera());
        if (!bf.getFechaFinCarrera().equals("")) {
            fechaFnCar = (Date) formatter.parse(bf.getFechaFinCarrera());
        }


        bec.setFechaNac(date); //Fin conversion y seteo de fecha
        bec.setFondo(bf.getFondo());
        bec.setFoto(bf.getFoto());
        bec.setInstEduMedia(bf.getInstEduMedia());
        bec.setLugarNac(bf.getLugarNac());
        bec.setMcipioOrigen(bf.getMcipioOrigen());
        bec.setNombres(bf.getNombres());
        /**
         * Busqueda de recomendar y adición de objeto Recomendador a la tabla
         * Becario
         */
        if (bf.getCodRecomendador() != 0) {
            Recomendador rec = (Recomendador) session.get(Recomendador.class, bf.getCodRecomendador());
            //System.out.println("El recomendador se llama: "+rec.getNombreCompleto());
            bec.setRecomendador(rec);
        }

        bec.setTipoSangre(bf.getTipoSangre());
        bec.setDirOrigen(bf.getDirOrigen());
        bec.setSexo(bf.getSexo());
        bec.setTels(bf.getPhonesString());

        if (bf.getEmails() != null) {
            bec.setEmails(bf.getEmailsString());
        } else {
            bf.setEmails(new String[0]);
        }


        Universidad u = (Universidad) session.get(Universidad.class, bf.getCodUniversidad());
        bec.setUniversidad(u);
        //bec.setUniversidad(bf.getUniversidad());

        /**
         * Obteniendo la carrera de acuerdo al codigo seleccionado en el form
         */
        
        CarreraId cid = new CarreraId();
        cid.setCodCarrera(bf.getCodCarrera());
        cid.setIdUniv(bf.getCodUniversidad());
        Carrera c = (Carrera) session.get(Carrera.class, cid);

        CarreraXBecarioId cxbId = new CarreraXBecarioId();
        //cxbId.setCarnet(bec.getCarnet());
        cxbId.setIdUniv(bec.getUniversidad().getIdUniv());
        cxbId.setCodCarrera(bec.getCodCarrera());
        cxbId.setCarnet(bec.getCarnet());

        //Seteando informacion en tabla carrera_x_becario
        CarreraXBecario cxb = new CarreraXBecario();
        cxb.setId(cxbId);
        cxb.setBecario(bec);
        cxb.setCarrera(c);
        cxb.setEstado(bec.getEstado());
        cxb.setFechaInicio(fechaInCar);
        if (fechaFnCar != null) {
            cxb.setFechaFin(fechaFnCar);
        }
        session.save(bec);
        session.save(cxb);
    }

    public List<Recomendador> getAllRecomendadores() {

        List<Recomendador> allRecomendadores;
        Query queryResult = session.createQuery("From Recomendador");
        allRecomendadores = new ArrayList<Recomendador>(queryResult.list());

        return allRecomendadores;
    }

    public List<Universidad> getUniversidadesActivas() {
        List<Universidad> allUniversidades;
        Query queryResult = session.createQuery("From Universidad where estado='A'");
        allUniversidades = new ArrayList<Universidad>(queryResult.list());
        return allUniversidades;
    }

    public List<Carrera> getAllCarreras(int codUniv) {
        List<Carrera> allCarreras;
        Query query = session.createQuery("From Carrera where id.idUniv = :univ and estado='A'");
        query.setInteger("univ", codUniv);
        allCarreras = new ArrayList<Carrera>(query.list());

        return allCarreras;
    }
    

    public List<Becario> buscarBecarioDB(BecarioForm bf) {
        Criteria crit = session.createCriteria(Becario.class).add(Expression.conjunction().add(Expression.like("carnet", "%" + bf.getCarnet() + "%")).add(Expression.like("nombres", "%" + bf.getNombres() + "%")).add(Expression.like("apellidos", "%" + bf.getApellido() + "%")).add(Expression.like("mcipioOrigen", "%" + bf.getMcipioOrigen() + "%")).add(Expression.like("deptoOrigen", "%" + bf.getDeptoOrigen() + "%")));
        List<Becario> listBec = new ArrayList<Becario>(crit.list());
        return listBec;
    }

    /*
     * Devuelve el objeto y lo pobla en el formulario
     */
    public void buscarBecarioDB(String carnet, BecarioForm bf) {
        Becario bec = buscarBecarioDB(carnet);
        bf.setNombres(bec.getNombres());
        //Preguntar si hay guardado un recomendador
        if (bec.getRecomendador() != null) {
            bf.setCodRecomendador(bec.getRecomendador().getCodRecomendador());
        }
        bf.setAlergicoA(bec.getAlergicoA());
        bf.setApellido(bec.getApellidos());
        bf.setCarnet(bec.getCarnet());
        bf.setDeptoOrigen(bec.getDeptoOrigen());
        bf.setDirActual(bec.getDirActual());
        bf.setCma(bec.getCma());
        bf.setCodUniversidad(bec.getUniversidad().getIdUniv());
        bf.setCodCarrera(bec.getCodCarrera());
        bf.setCum(bec.getCum().doubleValue());
        bf.setMcipioOrigen(bec.getMcipioOrigen());
        bf.setDeptoOrigen(bec.getDeptoOrigen());
        bf.setDirActual(bec.getDirActual());
        bf.setDirIem(bec.getDirIem());
        bf.setDui(bec.getDui());
        bf.setEstCivil(bec.getEstCivil());
        bf.setEstado(bec.getEstado());
        if (bec.getTels() != null) {
            bf.setPhonesString(bec.getTels());
        } else {
            bf.setPhones(new String[0]);
        }

        /*
         * Darle formato a la fecha
         */
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MMMM-yyyy");
        String fecha = sdf.format(bec.getFechaNac());
        bf.setFechaNac(fecha);
        bf.setFondo(bec.getFondo());
        bf.setSexo(bec.getSexo());
        bf.setLugarNac(bec.getLugarNac());
        bf.setTipoSangre(bec.getTipoSangre());
        bf.setDirOrigen(bec.getDirOrigen());
        if (bec.getEmails() != null) {
            bf.setEmailsString(bec.getEmails());
        } else {
            bf.setEmails(new String[0]);
        }

        bf.setInstEduMedia(bec.getInstEduMedia());

        /*
         * Obtener Fecha de Inicio y Fin de Carrera
         */
        //CarreraXBecario cxb = (CarreraXBecario) session.get(CarreraXBecario.class, new CarreraXBecarioId(bec.getCodCarrera(), bec.getUniversidad().getIdUniv()));
        
        Query queryResult = session.createQuery("from CarreraXBecario where estado = 'A' and id.carnet = :carnet and id.idUniv = :idUniv and id.codCarrera = :codCarrera");
        queryResult.setInteger("idUniv", bec.getUniversidad().getIdUniv());
        queryResult.setInteger("codCarrera", bec.getCodCarrera());
        queryResult.setParameter("carnet", bec.getCarnet());
        
        List<CarreraXBecario> cxbL = new ArrayList<CarreraXBecario>(queryResult.list());
        if (!(cxbL == null || cxbL.isEmpty())){
            CarreraXBecario cxb = cxbL.get(0);
/*
            * Dandole formato a fechaInicio y fechaFin para mostrarlas en el form
            */
            bf.setFechaIniCarrera(sdf.format(cxb.getFechaInicio()));

            if (cxb.getFechaFin() != null) {
                bf.setFechaFinCarrera(sdf.format(cxb.getFechaFin()));
            }
        }
        
        bf.setOldCarnet(bec.getCarnet());
        
    }

    public BecarioForm modificarBecarioDB(BecarioForm bf) throws Exception {
        
        int x = 0;
        x = x + 4;
        
        Becario bec;
        if(bf.getCarnet().equals(bf.getOldCarnet())){
            bec = (Becario) session.get(Becario.class, bf.getCarnet());
        } else {
            
            ActualizarCarnet(bf.getOldCarnet(),bf.getCarnet());
            session.flush();
            bec = (Becario) session.get(Becario.class, bf.getCarnet());
        }
        
        //bec.setCarnet(bf.getCarnet());
        
        //Para evitarnos problemas vamos a borrar el registro actualmente guardado en CarreraXBecario
        CarreraXBecario cxbAnt = (CarreraXBecario)session.get(CarreraXBecario.class,new CarreraXBecarioId(bec.getCodCarrera(),bec.getUniversidad().getIdUniv(),bec.getCarnet()));
        session.delete(cxbAnt);
        session.flush();
        bec.setAlergicoA(bf.getAlergicoA());
        bec.setApellidos(bf.getApellido());
        bec.setCarnet(bf.getCarnet());
        bec.setCma(bf.getCma());
        bec.setCodCarrera(bf.getCodCarrera());
        bec.setCum(BigDecimal.valueOf(bf.getCum()));
        bec.setDeptoOrigen(bf.getDeptoOrigen());
        bec.setDirActual(bf.getDirActual());
        bec.setDirIem(bf.getDirIem());
        bec.setDui(bf.getDui());
        bec.setEstCivil(bf.getEstCivil());
        bec.setEstado(bf.getEstado());
        /**
         * Convirtiendo las fechas de String a Timestamp para guardarlo en la
         * base
         */
        DateFormat formatter;

        Date date;
        Date fechaInCar;
        Date fechaFnCar = null;
        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        date = (Date) formatter.parse(bf.getFechaNac());
        fechaInCar = (Date) formatter.parse(bf.getFechaIniCarrera());
        if (!bf.getFechaFinCarrera().equals("")) {
            fechaFnCar = (Date) formatter.parse(bf.getFechaFinCarrera());
        }


        bec.setFechaNac(date); //Fin conversion y seteo de fecha
        bec.setFondo(bf.getFondo());
        bec.setFoto(Utils.isNullOrEmpty(bf.getFoto()) ? bec.getFoto() : bf.getFoto());


        bec.setInstEduMedia(bf.getInstEduMedia());
        bec.setLugarNac(bf.getLugarNac());
        bec.setMcipioOrigen(bf.getMcipioOrigen());
        bec.setNombres(bf.getNombres());
        /**
         * Busqueda de recomendar y adición de objeto Recomendador a la tabla
         * Becario
         */
        if (bf.getCodRecomendador() != 0) {
            Recomendador rec = (Recomendador) session.get(Recomendador.class, bf.getCodRecomendador());
            //System.out.println("El recomendador se llama: "+rec.getNombreCompleto());
            bec.setRecomendador(rec);
        }

        bec.setTipoSangre(bf.getTipoSangre());
        bec.setDirOrigen(bf.getDirOrigen());
        bec.setSexo(bf.getSexo());
        bec.setTels(bf.getPhonesString());

        if (bf.getEmails() != null) {
            bec.setEmails(bf.getEmailsString());
        } else {
            bf.setEmails(new String[0]);
        }


        Universidad u = (Universidad) session.get(Universidad.class, bf.getCodUniversidad());
        bec.setUniversidad(u);
        //bec.setUniversidad(bf.getUniversidad());

        /**
         * Obteniendo la carrera de acuerdo al codigo seleccionado en el form
         */
        
        Carrera c = (Carrera) session.get(Carrera.class,new CarreraId(bf.getCodCarrera(),bf.getCodUniversidad()));
        bec.setCodCarrera(bf.getCodCarrera());
        
        CarreraXBecarioId cxbId = new CarreraXBecarioId();
        cxbId.setCarnet(bec.getCarnet());
        cxbId.setIdUniv(bec.getUniversidad().getIdUniv());
        cxbId.setCodCarrera(bec.getCodCarrera());
       
        
        //Seteando informacion en tabla carrera_x_becario
        CarreraXBecario cxb = new CarreraXBecario();
        cxb.setId(cxbId);
        cxb.setBecario(bec);
        cxb.setCarrera(c);
        cxb.setEstado(bec.getEstado());
        cxb.setFechaInicio(fechaInCar);
        if (fechaFnCar != null) {
            cxb.setFechaFin(fechaFnCar);
        }

        session.saveOrUpdate(bec);
        session.saveOrUpdate(cxb);
        return bf;
    }
    
    public List<Becario> getTodosBecariosActivos(){
        Criteria crit = session.createCriteria(Becario.class).add(Expression.eq("estado", "A"));
        List<Becario> listBec = new ArrayList<Becario>(crit.list());
        return listBec;
    }
    
     public List<Carrera> getAllCarreras(BecarioForm bf){
        List<Carrera> allCarreras;
        String hql = "";
        hql = (bf.getCodUniversidad() != 0) ? "From Carrera where id.idUniv = :univ" : "From Carrera";
        Query query = session.createQuery(hql);
        if (bf.getCodUniversidad() != 0)
            query.setInteger("univ",bf.getCodUniversidad());
        allCarreras = new ArrayList<Carrera>(query.list());
        return allCarreras;
    }
     
    public List<NameAndCarnetBean> getNamesAndCarnets() {
        String hql = "select new com.uca.sisbec.beans.NameAndCarnetBean(concat(carnet,' - ',nombres,' ',apellidos)) from Becario where estado = 'A'";
        Query query = session.createQuery(hql);
        List<NameAndCarnetBean> list = new ArrayList<NameAndCarnetBean>(query.list());
        return list;
    }
    
    private void ActualizarCarnet(String carnetViejo, String carnetNuevo) throws Exception {
        Statement stmnt = session.connection().createStatement();
        stmnt.executeUpdate("UPDATE becario SET carnet = '" + carnetNuevo + "' WHERE carnet = '" + carnetViejo + "';");
        stmnt.close();
    }
    
}
